package org.ourgrid.gridMonitor.operations;

import java.util.Timer;

import org.ourgrid.gridMonitor.Componente;
import org.ourgrid.gridMonitor.HamsterRecuperation;
import org.ourgrid.gridMonitor.LocalComponentInformation;
import org.ourgrid.gridMonitor.TipoMonitorado;
import org.ourgrid.gridMonitor.TipoOperacao;
import org.ourgrid.gridMonitor.client.ClientSocket;

public class BrokerLocalOperation {
	public static void processRequest(String[] mensagem) {
		if ((mensagem != null) && (mensagem.length > 0)) {
			int operation = Integer.parseInt(mensagem[0]);
			if (operation == TipoOperacao.COMPONENT_JOIN) {
				String hamsterPath = mensagem[1];
				System.out.println("Mensagem de COMPONENT_JOIN recebida. HamsterPath: " + hamsterPath);
				Componente.hamsterPath = hamsterPath;
			} else if (operation == TipoOperacao.COMPONENT_CONNECTION_REFUSED) {
				// Se a conexão foi recusada
				// O componente é considerado independente.
				Componente.timer.cancel();
				System.out.println("Connection refused by the Hamster monitor. Component working independently.");
			} else if (operation == TipoOperacao.HEARTBEAT) { // Se a conexão
				// foi recusada
				Componente.timer.cancel(); // Para o timer que está sendo
				// executado...
				Componente.timer = new Timer();
				// Cria um novo timer...
				// TODO há um erro ou nesse schedule de HamsterRecuperation ser
				// chamado, ou no fato dele sempre chamar RecuperaOpenfire.
				// Não recebimento do heartbeat não seria culpa do Openfire, já
				// que não usamos ele como subestrato de comunicação.
				// Componente.timer.schedule(new HamsterRecuperation(), 10000);
				// //Executa esse novo timer.
			}
		}
	}

	public static void connect(int tipoMonitorado, int portaComunicacao) {
		System.out.println("Servername: " + LocalComponentInformation.servername);
		System.out.println("Login: " + LocalComponentInformation.login);
		System.out.println("Password: " + LocalComponentInformation.password);

		String mensagem = TipoOperacao.COMPONENT_JOIN + Componente.separador + tipoMonitorado + Componente.separador
				+ portaComunicacao + Componente.separador;
		mensagem = mensagem + LocalComponentInformation.servername + Componente.separador
				+ LocalComponentInformation.login + Componente.separador + LocalComponentInformation.password;
		ClientSocket.mensagemConexao("127.0.0.1", LocalComponentInformation.INTERNAL_PORT, mensagem);
	}

	public static void sendNewJob(String mensagemFinal) {
		// A mensagem será 4#filename#jobID#date#path
		String mensagem = TipoOperacao.NEW_JOB_ADDED + Componente.separador + mensagemFinal;
		ClientSocket.mensagemConexao("127.0.0.1", LocalComponentInformation.INTERNAL_PORT, mensagem);
	}

	public static void saveBrokerInformation() {
		// 28#tipo#port#login#pass#servername
		String mensagem = TipoOperacao.UPDATE_COMPONENTE_INFORMATION + Componente.separador + TipoMonitorado.BROKER
				+ Componente.separador + Componente.portaComunicacao + Componente.separador;
		mensagem = mensagem + LocalComponentInformation.login + Componente.separador
				+ LocalComponentInformation.password + Componente.separador + LocalComponentInformation.servername;
		ClientSocket.mensagemConexao("127.0.0.1", LocalComponentInformation.INTERNAL_PORT, mensagem);
	}
}
